package com.example.mq.common;

import java.io.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: DongGuoZhen
 * @Date: 2024/02/27/22:00
 * @Description: 序列化  反序列化
 */
//下面的逻辑,其他的Java对象,都可以通过这个的逻辑进行序列化和反序列化  前提是实现Serializable接口
public class BinaryTool {

    /**
     * 把一个对象序列化为一个字节数组
     * @param object 某个对象
     * @return 序列化之后的字节数组
     */
    public static byte[] toBytes(Object object) throws IOException {
        //这个对象相当于变长的字节数组  ByteArrayOutputStream
        //就可以把object 序列化之后的数据逐渐的写入到byteArrayOutputStream,然后再统一转成字节数组 byte[]
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                objectOutputStream.writeObject(object);  //序列化 生成的二进制字节数据,就会写入到objectOutputStream
                //由于objectOutputStream是关联到了byteArrayOutputStream,最终结果就是写入到byteArrayOutputStream
            }
            //这个操作就是把byteArrayOutputStream 中持有的二进制数据取出来,然后转换成byte[]
            return byteArrayOutputStream.toByteArray();
        }

    }

    /**
     * 把一个字节数组反序列化成一个对象
     * @param data 字节数组
     * @return  反序列化之后的对象
     */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                //此处的readObject就是从data[] 中读取数据进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}